package org.finesys.common.netty.websocket.resolver;

import io.netty.channel.Channel;
import org.finesys.common.netty.websocket.support.MethodArgumentResolver;
import org.finesys.common.netty.websocket.support.NettySession;
import org.springframework.core.MethodParameter;

import static org.finesys.common.netty.websocket.constants.WebSocketAttributeKeyConstants.SESSION_KEY;

/**
 * 自定义session解析
 */
public class SessionMethodArgumentResolver implements MethodArgumentResolver {

    /**
     * 判断是否支持给定的方法参数。
     *
     * @param parameter 方法参数，包含方法参数的元数据。
     * @return 如果方法参数的类型是NettySession或其子类，则返回true；否则返回false。
     */
    @Override
    public boolean support(MethodParameter parameter) {
        return NettySession.class.isAssignableFrom(parameter.getParameterType());
    }

    /**
     * 重写resolveArgument方法以解析方法参数。
     *
     * @param parameter 方法参数，包含方法参数的元数据。
     * @param channel   WebSocket通道，用于处理WebSocket连接。
     * @param object     当前处理的对象，通常用于访问上下文或特定于请求的数据。
     * @return 从WebSocket通道的属性中获取与SESSION_KEY相关联的值。
     * @throws Exception 如果在解析参数过程中发生异常，则抛出该异常。
     */
    @Override
    public Object resolveArgument(MethodParameter parameter, Channel channel, Object object) throws Exception {
        return channel.attr(SESSION_KEY).get();
    }
}
